Springboot 如何让返回的json数据节点为空的时候不显示

bingo 2020年11月07日 22次浏览

首先默认情况下,spring为初始化了Converts,参考类WebMvcConfigurationSupport

protected final void addDefaultHttpMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
	messageConverters.add(new ByteArrayHttpMessageConverter());
	messageConverters.add(new StringHttpMessageConverter());
	messageConverters.add(new ResourceHttpMessageConverter());
	messageConverters.add(new ResourceRegionHttpMessageConverter());
	try {
		messageConverters.add(new SourceHttpMessageConverter<>());
	}
	catch (Throwable ex) {
		// Ignore when no TransformerFactory implementation is available...
	}
	messageConverters.add(new AllEncompassingFormHttpMessageConverter());

	if (romePresent) {
		messageConverters.add(new AtomFeedHttpMessageConverter());
		messageConverters.add(new RssChannelHttpMessageConverter());
	}

	if (jackson2XmlPresent) {
		Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.xml();
		if (this.applicationContext != null) {
			builder.applicationContext(this.applicationContext);
		}
		messageConverters.add(new MappingJackson2XmlHttpMessageConverter(builder.build()));
	}
	else if (jaxb2Present) {
		messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
	}

	if (jackson2Present) {
		Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.json();
		if (this.applicationContext != null) {
			builder.applicationContext(this.applicationContext);
		}
		messageConverters.add(new MappingJackson2HttpMessageConverter(builder.build()));
	}
	else if (gsonPresent) {
		messageConverters.add(new GsonHttpMessageConverter());
	}
	else if (jsonbPresent) {
		messageConverters.add(new JsonbHttpMessageConverter());
	}

	if (jackson2SmilePresent) {
		Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.smile();
		if (this.applicationContext != null) {
			builder.applicationContext(this.applicationContext);
		}
		messageConverters.add(new MappingJackson2SmileHttpMessageConverter(builder.build()));
	}
	if (jackson2CborPresent) {
		Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.cbor();
		if (this.applicationContext != null) {
			builder.applicationContext(this.applicationContext);
		}
		messageConverters.add(new MappingJackson2CborHttpMessageConverter(builder.build()));
	}
}
	

前提

protected final List<HttpMessageConverter<?>> getMessageConverters() {
	if (this.messageConverters == null) {
		this.messageConverters = new ArrayList<>();
	//该方法可以进行重写,加入我们自定义的Covnerter,如果添加成功,则默认的addDefaultHttpMessageConverters将不会执行	
	configureMessageConverters(this.messageConverters);
		if (this.messageConverters.isEmpty()) {
			addDefaultHttpMessageConverters(this.messageConverters);
		}
		extendMessageConverters(this.messageConverters);
	}
	return this.messageConverters;
}
  1. @Bean HttpMessageConverters org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration#messageConverters()
  2. @Bean requestMappingHandlerAdapter org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration#requestMappingHandlerAdapter()
  3. @Bean HandlerExceptionResolver org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport#handlerExceptionResolver()

在springboot启动的时候,就会依次在初始化这三个bean的时候调用getMessageConverters()方法,当初次进入getMessageConverters()时,messageConverters为null,则会调用WebMvcConfigurer#configureMessageConverters(List<HttpMessageConverter<?>>)。如果messageConverters仍为null,则调用addDefaultHttpMessageConverters(List<HttpMessageConverter<?>>)。最后调用extendsMessageConverters(List<HttpMessageConverter<?>>)。